﻿// 1102train01.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <unordered_map>
#include <unordered_set>
#include <bitset>
#include <set>

using namespace std;

class Solution01
{
public:
    Solution01(string&num_str)
    {
        if (num_str.size()<32 || num_str[0] == '0')
        {
            bitset<64>bs(num_str);
            uint64_t num = bs.to_ulong();
            cout << num;
            return;
        }

        num_str = num_str.substr(1);
        bitset<64>bs(num_str);
        uint64_t num = bs.to_ulong();
        uint64_t top = (1LL << 31);
        int result = (int)num - (int)top;
        cout << result;

	    //Solution01
    }
};


/*
1. 如果告警ID重复，只保留一个。（告警灵魂的唯一性必须维护！）
2. 按照告警ID表示值的升序排列。（魔法秩序不可打破！）
输入格式
- 第一行：一个整数，表示告警列表 arrayA 的长度，范围为 [0, 1000]。
- 第二行：告警列表 arrayA 的数据，告警ID以单空格分隔。
- 第三行：一个整数，表示告警列表 arrayB 的长度，范围为 [0, 1000]。
- 第四行：告警列表 arrayB 的数据，告警ID以单空格分隔。

输入
2
00001001 00ABCD00
3
FFFFFAAB FFFFFAAB 00ABCD00
输出
00001001
00ABCD00
FFFFFAAB
 */
class Solution02
{
public:
    Solution02(vector<string>&vec_a, vector<string>&vec_b)
    {
        set<string>total_v;

        for (auto&str:vec_a)
        {
            total_v.insert(str);
        }

        for (auto&str:vec_b)
        {
            total_v.insert(str);
        }

        for (auto&str:total_v)
        {
            cout << str << endl;
        }
	    //
    }
};


/*
 输入格式
- 第一行：一个字符串 word，表示单词。
- 第二行：一个整数 n，表示数字列表中的元素个数。
- 接下来 n 行，每行包含一个字符串，表示数字或数字范围。
  - 如果是单独的数字，则格式为 数字。
  - 如果是数字范围，则格式为 数字a-数字b，数字a<=数字b。
- word的长度不超过10
- 数字总数不会超过9999，并且都在范围1-9999中
输出格式
输出多行，每行一个字符串，格式为 单词-数字。如果某个数字重复出现，则按递增的后缀输出。每个后缀是一个4位整数，不足4位用0来填充。

输入
word
5
1
10
9-11
9999
9999
输出
word-0001
word-0010
word-0009
word-0011
word-0012
word-9999
word-0002
*/
class Solution03
{
public:
    void handleNumStr(vector<string>& str_vec)
    {
        for (int i = 0; i < (int)str_vec.size(); i++)
        {
            string str = str_vec[i];
            if (str.find('-') == string::npos)
            {
                num_vec.push_back(make_pair(stoi(str), i));
                continue;
            }

            int pos = (int)str.find('-');

            int start = stoi(str.substr(0, pos));
            int end = stoi(str.substr(pos + 1));

            for (int curr = start; curr <= end; curr++)
            {
                num_vec.push_back(make_pair(curr, i));
            }
            //
        }
    }

    void handleResult(string& word, vector<pair<string, int>>&result)
    {
        for (auto& p_item : num_vec)
        {
            int val = p_item.first, index = p_item.second;
            while (num_set.find(val) != num_set.end())
            {
                if (val == 9999)
                {
                    val = 1;
                    continue;
                }
                val++;
            }
            num_set.insert(val);

            string val_str = to_string(val);
            while (val_str.size() < 4)
            {
                val_str = '0' + val_str;
            }
            val_str = word + '-' + val_str;
            result.push_back(make_pair(val_str, index));
            //
        }
    }

    Solution03(string&word, vector<string>&str_vec)
    {
        handleNumStr(str_vec);
        sort(num_vec.begin(), num_vec.end(),[&](pair<int,int>&p1, pair<int,int>&p2)
        {
            return p1.first < p2.first;
        });
        vector<pair<string, int>>result;

        handleResult(word, result);

        sort(result.begin(), result.end(), [&](pair<string, int>& p1, pair<string, int>& p2)
            {
                return p1.second < p2.second;
            });

        for (auto&p_item:result)
        {
            cout << p_item.first << endl;
        }

        //
    }
private:
    vector<pair<int, int>>num_vec;
    unordered_set<int>num_set;
	//
};


/*
 输入格式
- 第一行：一个整数 n，表示列表中的数字个数。
- 第二行：一个包含 n 个整数的列表 numbers，这些整数是从 1 到 n 的一组乱序整数。
- 1 <= n <= 10^5
输出格式
输出一个整数，表示从 1 到 n 每一对相邻数字在列表中的索引差距的总和。

输入
5
1 5 3 4 2
输出
9
 */
class Solution04
{
public:
    Solution04(vector<int>&num_vec, int size)
    {
        vector<int>pos_vec(size + 1);

        for (int i=0; i<size; i++)
        {
            pos_vec[num_vec[i]] = i;
        }

        int result = 0;

        for (int i=1; i<int(pos_vec.size())-1; i++)
        {
            result += abs(pos_vec[i] - pos_vec[i + 1]);
        }
        cout << result;
        //
    }
    //
};


int main()
{
	{
        int size;
        cin >> size;
        vector<int>num_vec(size);
        for (int i=0; i<size; i++)
        {
            cin >> num_vec[i];
        }

        Solution04 solu(num_vec, size);
        return 0;
	}
	{
        string word;
        cin >> word;
        int size;
        cin >> size;
        vector<string>str_vec(size);
        for (int i=0; i<size; i++)
        {
            cin >> str_vec[i];
        }

        Solution03 solu(word, str_vec);

        return 0;
	}
	{
        int size_a;
        cin >> size_a;

        vector<string>vec_a(size_a);
        for (int i=0; i<size_a; i++)
        {
            cin >> vec_a[i];
        }

        int size_b;
        cin >> size_b;
        vector<string>vec_b(size_b);
        for (int i=0; i<size_b; i++)
        {
            cin >> vec_b[i];
        }

        Solution02 solu(vec_a, vec_b);

        return 0;
	}
    string str;
    cin >> str;
    Solution01 solu(str);
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
